树莓派2.13寸触控墨水屏模块使用教程 您所在的位置:网站首页 pixel 2 参数 树莓派2.13寸触控墨水屏模块使用教程

树莓派2.13寸触控墨水屏模块使用教程

2023-03-23 10:18| 来源: 网络整理| 查看: 265

说明 资料 FAQ 售后 说明

详细参数、原理说明

特点尺寸: 2.13 inch外形尺寸(模块):69.15mm × 38.9mm外形尺寸(驱动板):59.51mm × 34.00mm显示尺寸:48.55mm × 23.71mm工作电压:3.3V/5V通信接口:SPI点距:0.194* 0.194分辨率:250*122显示颜色:黑、白灰度等级:2局部刷新 :0.3s全局刷新 :2s刷新功耗 : 26.4mW(typ.)触控点数 :10(MAX)触摸类型 :电容触摸触摸接口 :I2C触摸面板 :钢化玻璃面板

【备注】: 刷新时间:刷新时间为实验测试数据,实际刷新时间会有误差,以实际效果为准。全局刷新过程中会有闪烁效果,这个是正常现象功耗:功耗数据为实验测试数据,实际功耗由于驱动板的存在和实际使用情况的不同,会有一定误差,以实际效果为准

SPI 通信时序

由于墨水屏只需要显示,这里将从机发,主机收的数据线(MISO)隐藏。CS:从机片选,当CS为低电平的时候,芯片使能DC:数据/命令控制引脚,当DC=0时写入命令;DC=1时写入数据SCLK: SPI通信时钟SDIN:SPI通信主机发送,从机接收时序:CPHL=0, CPOL=0 (SPI0)【备注】具体关于SPI通信的相关信息,可以自行网上搜索资料了解

墨水屏刷新原理工作原理本产品使用的电子纸采用“微胶囊电泳显示”技术进行图像显示,其基本原理是悬浮在液体中的带电纳米粒子受到电场作用而产生迁移。电子纸显示屏是靠反射环境光来显示图案的,不需要背光,在环境光下,电子纸显示屏清晰可视,可视角度几乎达到了 180°。因此,电子纸显示屏非常适合阅读。像素与字节的关系

对于黑白图片,我们可以规定,如果如果是黑色我们定义成0,如果是白色就定义成1,那么有了表示颜色的方式:白色:□,对应1黑色:■:对应0

一个点在图形上一般称之为像素点(pixel),而颜色不是1就是0,也就是1个位就可以标识颜色:1Pixel = 1bit,那么一个字节里面就包含了8个像素点。以16个像素点为例,我们假设前8个像素点为黑,后8个像素点为白色,那么可以这么认为,像素点1-16,对应这0位到15位,0表示黑色,1表示白色:

对于计算机而言,它的数据存储方式是高位在前,低位在后,且一个字节只有8个位,因此会有一点改变:这样只需要2个字节即可表示16个像素点了。

RPI使用教程Raspberry Pi

提供BCM2835、WiringPi、文件IO、RPI(Python)库例程

硬件连接

连接树莓派的时候,可以直接插到树莓派的40PIN排针上去,注意对好引脚。如果是选择用12PIN排线连接的话,请参考下方的引脚对应表格

树莓派连接引脚对应关系Touch e-PaperRaspberry PiBCM2835编码Board物理引脚序号VCC3.3V3.3VGNDGNDGNDDINMOSI19CLKSCLK23CSCE024DC2522ERST1711BUSY2418INT2713SCLSCL15SDASDA13TRST2215

以2.13inch Touch e-Paper HAT为例,直接插在树莓派上即可:

开启SPI接口打开树莓派终端,输入以下指令进入配置界面sudo raspi-config选择Interfacing Options -> SPI -> Yes 开启SPI接口

然后重启树莓派:

sudo reboot

请确保SPI没有被其他的设备占用,你可以在/boot/config.txt中间检查

打开I2C接口

在终端执行:

sudo raspi-config 选择 Interfacing Options -> I2C ->yes 启动 i2C 内核驱动

然后重启树莓派:

sudo reboot安装库安装BCM2835, 打开树莓派终端,并运行以下指令wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.gztar zxvf bcm2835-1.68.tar.gz cd bcm2835-1.68/sudo ./configure && sudo make && sudo make check && sudo make install# 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/安装wiringPisudo apt-get install wiringpi#对于树莓派2019年5月之后的系统(早于之前的可不用执行),可能需要进行升级:wget https://project-downloads.drogon.net/wiringpi-latest.debsudo dpkg -i wiringpi-latest.debgpio -v# 运行gpio -v会出现2.52版本,如果没有出现说明安装出错安装Python函数库#python2sudo apt-get updatesudo apt-get install python-pipsudo apt-get install python-pilsudo apt-get install python-numpysudo pip install RPi.GPIOsudo pip install spidev#python3sudo apt-get updatesudo apt-get install python3-pipsudo apt-get install python3-pilsudo apt-get install python3-numpysudo pip3 install RPi.GPIOsudo pip3 install spidev下载测试程序

打开树莓派终端,执行:方法一:从我们官网下载,推荐使用。

cd ~sudo wget https://www.waveshare.net/w/upload/3/3e/Touch_e-Paper_Code.zipunzip Touch_e-Paper_Code.zip -d Touch_e-Paper_Code运行测试程序C语言进入C语言例程目录cd ~/Touch_e-Paper_Code/csudo nano examples/main.c (可选)修改Makefile的14-16行切换依赖库,程序默认使用BCM2835,速度最快。(使用过BCM2835后再用别的库需要重启才能正常运行)

如下图,切换注释即可:

重新编译,然后运行程序,编译过程可能需要几秒在c目录下,运行以下指令make cleanmake -4sudo ./epdpython进入python程序目录cd cd ~/Touch_e-Paper_Code/python/examples运行例程,程序支持python2/3# python2sudo python2 main.py# python3sudo python3 main.pyAPI详解API 解析

程序分为底层硬件接口、中间层墨水屏驱动和触摸驱动、上层应用;

C底层硬件接口

我们进行了底层的封装,由于硬件平台不一样,内部的实现是不一样的,如果需要了解内部实现可以去对应的目录中查看在DEV_Config.c(.h)可以看到很多定义,在目录:Touch_e-Paper_Code\c\lib\Config

C语言使用了3种方式进行驱动:分别是BCM2835库、WiringPi库和文件IO默认使用BCM2835库进行操作,如果你需要使用其他库来驱动的话,可以打开Touch_e-Paper_Code\c\Makefile,修改14-16行,如下:700px数据类型:#define UBYTE uint8_t#define UWORD uint16_t#define UDOUBLE uint32_t模块初始化与退出的处理:void DEV_Module_Init(void);void DEV_Module_Exit(void);注意:1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。2.DEV_Module_Exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;GPIO读写:

UBYTE DEV_Digital_Read(UWORD Pin); void DEV_Digital_Write(UWORD Pin, UBYTE Value);

SPI写数据

void DEV_SPI_WriteByte(UBYTE Value); void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len);

I2C读写数据

UBYTE I2C_Read_Byte(UWORD Reg, char *Data, UBYTE len); UBYTE I2C_Write_Byte(UWORD Reg, char *Data, UBYTE len);

中间层墨水屏驱动

e-paper驱动代码文件,在目录:Touch_e-Paper_Code\c\lib\e-paper打开.h可以看到如下的函数

墨水屏初始化,在屏幕开始工作时和退出睡眠模式之后调用void EPD_xxx_Init(void);

其中xxx表示,墨水屏型号。如是是2.13_V2,全屏初始化那么是EPD_2IN13_V2_Init(),

清屏,把墨水屏刷成白色void EPD_xxx_Clear(void);

其中xxx表示,墨水屏型号。如是是2.13_V2,那么是EPD_2IN13_V2_Clear()

传输一帧的图片数据并打开显示//黑白双色墨水屏void EPD_xxx_Display(UBYTE *Image);//黑白红或黑白黄墨水屏void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);//2.13inch e-paper V2由于控制芯片升级,对于局部刷新,需要调用EPD_xxx_DisplayPartBaseImage显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的EPD_xxx_DisplayPart()void EPD_2IN13_V2_DisplayPart(UBYTE *Image);void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);进入睡眠模式void EPD_xxx_Sleep(void);

注意进入了睡眠模式,只有两个方式能够重新工作:第一种硬件复位,第二种重新调用初始化函数其中xxx表示,墨水屏型号。如是是2.13_V2,那么是EPD_2IN13_V2_Sleep()

中间层触控驱动

触摸控制驱动代码,在目录:Touch_e-Paper_Code\c\lib\Driver 打开.h文件可以看到函数列表

触控初始化及其相关函数:void GT_Init(void); // 初始化void GT_Reset(void); // 复位void GT_ReadVersion(void); // 读取版本信息

其中,复位函数和读取版本信息在初始化时被调用

触控芯片读写数据void GT_Read(UWORD Reg, char *Data, UBYTE len); // 触控读数据void GT_Write(UWORD Reg, char *Data, UBYTE len); // 触控写数据

Reg为寄存器地址,Data为数据缓冲区的地址,len为要读写的长度

扫描触摸信号UBYTE GT_Scan(void); // 扫描触摸信号

返回的数据存在结构体GT1151_Dev中

上层应用

对于屏幕而言,如果需要进行画图、显示中英文字符、显示图片等怎么办,这些都是上层应用做的。这有很多小伙伴有问到一些图形的处理,我们这里提供了一些基本的功能 在如下的目录中可以找到GUI,在目录:Touch_e-Paper_Code\c\lib\GUI\GUI_Paint.c(.h)在如下目录下是GUI依赖的字符字体,在目录:Touch_e-Paper_Code\c\lib\Fonts

新建图像属性:新建一个图像属性,这个属性包括图像缓存的名称、宽度、高度、翻转角度、颜色void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)参数: image : 图像缓存的名称,实际上是一个指向图像缓存首地址的指针; Width : 图像缓存的宽度; Height: 图像缓存的高度; Rotate:图像的翻转的角度 Color :图像的初始颜色;选择图像缓存:选择图像缓存,选择的目的是你可以创建多个图像属性,图像缓存可以存在多个,你可以选择你所创建的每一张图像void Paint_SelectImage(UBYTE *image)参数: image: 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;图像旋转:设置选择好的图像的旋转角度,最好使用在Paint_SelectImage()后,可以选择旋转0、90、180、270void Paint_SetRotate(UWORD Rotate)参数: Rotate: 图像选择角度,可以选择ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270分别对应0、90、180、270度【说明】不同选择角度下,坐标对应起始像素点不同,这里以1.54B为例,四张图,按顺序为0°, 90°, 180°, 270°。仅做为参考  

图像镜像翻转:设置选择好的图像的镜像翻转,可以选择不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像。void Paint_SetMirroring(UBYTE mirror)参数: mirror: 图像的镜像方式,可以选择MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN分别对应不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像设置点在缓存中显示位置和颜色:这里是GUI最核心的一个函数、处理点在缓存中显示位置和颜色;void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)参数: Xpoint: 点在图像缓存中X位置 Ypoint: 点在图像缓存中Y位置 Color : 点显示的颜色图像缓存填充颜色:把图像缓存填充为某颜色,一般作为屏幕刷白的作用void Paint_Clear(UWORD Color)参数: Color: 填充的颜色图像缓存部分窗口填充颜色:把图像缓存的某部分窗口填充为某颜色,一般作为窗口刷白的作用,常用于时间的显示,刷白上一秒void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)参数: Xstart: 窗口的X起点坐标 Ystart: 窗口的Y起点坐标 Xend: 窗口的X终点坐标 Yend: 窗口的Y终点坐标 Color: 填充的颜色画点:在图像缓存中,在(Xpoint, Ypoint)上画点,可以选择颜色,点的大小,点的风格void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)参数: Xpoint: 点的X坐标 Ypoint: 点的Y坐标 Color: 填充的颜色 Dot_Pixel: 点的大小,提供默认的8种大小点 typedef enum { DOT_PIXEL_1X1 = 1, // 1 x 1 DOT_PIXEL_2X2 , // 2 X 2 DOT_PIXEL_3X3 , // 3 X 3 DOT_PIXEL_4X4 , // 4 X 4 DOT_PIXEL_5X5 , // 5 X 5 DOT_PIXEL_6X6 , // 6 X 6 DOT_PIXEL_7X7 , // 7 X 7 DOT_PIXEL_8X8 , // 8 X 8 } DOT_PIXEL; Dot_Style: 点的风格,大小扩充方式是以点为中心扩大还是以点为左下角往右上扩大 typedef enum { DOT_FILL_AROUND = 1, DOT_FILL_RIGHTUP, } DOT_STYLE;画线:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画线,可以选择颜色,线的宽度,线的风格void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)参数: Xstart: 线的X起点坐标 Ystart: 线的Y起点坐标 Xend: 线的X终点坐标 Yend: 线的Y终点坐标 Color: 填充的颜色 Line_width: 线的宽度,提供默认的8种宽度 typedef enum { DOT_PIXEL_1X1 = 1, // 1 x 1 DOT_PIXEL_2X2 , // 2 X 2 DOT_PIXEL_3X3 , // 3 X 3 DOT_PIXEL_4X4 , // 4 X 4 DOT_PIXEL_5X5 , // 5 X 5 DOT_PIXEL_6X6 , // 6 X 6 DOT_PIXEL_7X7 , // 7 X 7 DOT_PIXEL_8X8 , // 8 X 8 } DOT_PIXEL; Line_Style: 线的风格,选择线是以直线连接还是以虚线的方式连接 typedef enum { LINE_STYLE_SOLID = 0, LINE_STYLE_DOTTED, } LINE_STYLE;画矩形:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画一个矩形,可以选择颜色,线的宽度,是否填充矩形内部void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)参数: Xstart: 矩形的X起点坐标 Ystart: 矩形的Y起点坐标 Xend: 矩形的X终点坐标 Yend: 矩形的Y终点坐标 Color: 填充的颜色 Line_width: 矩形四边的宽度,提供默认的8种宽度 typedef enum { DOT_PIXEL_1X1 = 1, // 1 x 1 DOT_PIXEL_2X2 , // 2 X 2 DOT_PIXEL_3X3 , // 3 X 3 DOT_PIXEL_4X4 , // 4 X 4 DOT_PIXEL_5X5 , // 5 X 5 DOT_PIXEL_6X6 , // 6 X 6 DOT_PIXEL_7X7 , // 7 X 7 DOT_PIXEL_8X8 , // 8 X 8 } DOT_PIXEL; Draw_Fill: 填充,是否填充矩形的内部 typedef enum { DRAW_FILL_EMPTY = 0, DRAW_FILL_FULL, } DRAW_FILL;画圆:在图像缓存中,以 (X_Center Y_Center) 为圆心,画一个半径为Radius的圆,可以选择颜色,线的宽度,是否填充圆内部void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)参数: X_Center: 圆心的X坐标 Y_Center: 圆心的Y坐标 Radius:圆的半径 Color: 填充的颜色 Line_width: 圆弧的宽度,提供默认的8种宽度 typedef enum { DOT_PIXEL_1X1 = 1, // 1 x 1 DOT_PIXEL_2X2 , // 2 X 2 DOT_PIXEL_3X3 , // 3 X 3 DOT_PIXEL_4X4 , // 4 X 4 DOT_PIXEL_5X5 , // 5 X 5 DOT_PIXEL_6X6 , // 6 X 6 DOT_PIXEL_7X7 , // 7 X 7 DOT_PIXEL_8X8 , // 8 X 8 } DOT_PIXEL; Draw_Fill: 填充,是否填充圆的内部 typedef enum { DRAW_FILL_EMPTY = 0, DRAW_FILL_FULL, } DRAW_FILL;写Ascii字符:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一个Ascii字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)参数: Xstart: 字符的左顶点X坐标 Ystart: 字体的左顶点Y坐标 Ascii_Char:Ascii字符 Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体: font8:5*8的字体 font12:7*12的字体 font16:11*16的字体 font20:14*20的字体 font24:17*24的字体 Color_Foreground: 字体颜色 Color_Background: 背景颜色写英文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串英文字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)参数: Xstart: 字符的左顶点X坐标 Ystart: 字体的左顶点Y坐标 pString:字符串,字符串是一个指针 Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体: font8:5*8的字体 font12:7*12的字体 font16:11*16的字体 font20:14*20的字体 font24:17*24的字体 Color_Foreground: 字体颜色 Color_Background: 背景颜色写中文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串中文字符,可以选择GB2312编码字符字库、字体前景色、字体背景色;void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)参数: Xstart: 字符的左顶点X坐标 Ystart: 字体的左顶点Y坐标 pString:字符串,字符串是一个指针 Font: GB2312编码字符字库,在Fonts文件夹中提供了以下字体: font12CN:ascii字符字体11*21,中文字体16*21 font24CN:ascii字符字体24*41,中文字体32*41 Color_Foreground: 字体颜色 Color_Background: 背景颜色写数字:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串数字,可以选择Ascii码可视字符字库、字体前景色、字体背景色void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)参数: Xstart: 字符的左顶点X坐标 Ystart: 字体的左顶点Y坐标 Nummber:显示的数字,这里使用的是32位长的int型保存,可以最大显示到2147483647 Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体: font8:5*8的字体 font12:7*12的字体 font16:11*16的字体 font20:14*20的字体 font24:17*24的字体 Color_Foreground: 字体颜色 Color_Background: 背景颜色显示时间:在图像缓存中,在 (Xstart Ystart) 为左顶点,显示一段时间,可以选择Ascii码可视字符字库、字体前景色、字体背景色;这里是方便测试局部刷新而写的,因为局部刷新需要的时间为0.3S,整体显示少于1S加上数据的传输,可以做到1S刷新一次void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)参数: Xstart: 字符的左顶点X坐标 Ystart: 字体的左顶点Y坐标 pTime:显示的时间,这里定义好了一个时间的结构体,只要把时分秒各位数传给参数; Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体: font8:5*8的字体 font12:7*12的字体 font16:11*16的字体 font20:14*20的字体 font24:17*24的字体 Color_Foreground: 字体颜色 Color_Background: 背景颜色写图片:把一个位图写入图像缓存中void Paint_DrawBitMap(const unsigned char* image_buffer)参数: image_buffer: 图像数据的缓存中的首地址读取本地的bmp图片并写到缓存中

对于Jetson Nano, Raspberry Pi这些Linux操作系统的,可以读写图片对于Raspberry Pi和Jetson Nano,在目录:RaspberryPi_JetsonNano\c\lib\GUI\GUI_BMPfile.c(.h)

UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart)参数: path:BMP图片的相对路径 Xstart: 图片的左顶点X坐标,一般默认传0 Ystart: 图片的左顶点Y坐标,一般默认传0用户测试代码

前三个章节介绍了经典的linux三层代码结构,这里稍微讲解一下用户测试代码在目录:Touch_e-Paper_Code\c\examples,为全部的测试代码示例程序展示了画板和相册功能,用户可以按照已有的图片名字和尺寸自行替换图片以在该程序的基础上进行二次开发

Python(适用于Raspberry Pi)

适用于python2.7和python3对于python而言他的调用没有C复杂库文件都在:Touch_e-Paper_Code\python\lib\TP_lib\ 

epdconfig.py模块初始化与退出的处理:def module_init()def module_exit() 注意: 1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。 2.module_exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;GPIO读写:def digital_write(pin, value)def digital_read(pin)SPI写数据def spi_writebyte(data)I2C读写数据:def i2c_readbyte(reg, len)def i2c_write(reg)def i2c_writebyte(reg, value)epdxxx.py(xxx表示尺寸,若是2.13inch V2 e-paper,则为epd2in13_V2.py,依此类推)墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用def init(self)清屏,把墨水屏刷成白色def Clear(self)把图片转换成数组def getbuffer(self, image)传输一帧的图片数据并打开显示def display(self, image)

对于2.13inch e-paper V2由于控制芯片升级,对于局部刷新,需要调用displayPartBaseImage()显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的displayPart() def displayPartBaseImage(self, image) def displayPart(self, image)

进入睡眠模式def sleep(self)main.py

进行例程测试,示例程序展示了画板和相册功能,用户可以按照已有的图片名字和尺寸自行替换图片以在该程序的基础上进行二次开发

关于旋转设置

如果在python程序中你需要设置屏幕旋转,可以通过语句blackimage = blackimage.transpose(Image.ROTATE_270)设置。

blackimage = blackimage.transpose(Image.ROTATE_270) redimage = redimage.transpose(Image.ROTATE_270)#支持ROTATE_90, ROTATE_180, ROTATE_270三个参数旋转效果,以1.54B为例, 按顺序分别为0°, 90°,180°, 270°

画图GUI

由于python有一个image库pil官方库链接,他十分的强大,不需要像C从逻辑层出发编写代码,可以直接引用image库进行图像处理,以下将以1.54inch e-paper为例,对程序中使用了的进行简要说明

需要使用image库,需要安装库sudo apt-get install python3-pil 安装库

然后导入库

from PIL import Image,ImageDraw,ImageFont

其中Image为基本库、ImageDraw为画图功能、ImageFont为文字

定义一个图像缓存,以方便在图片上进行画图、写字等功能image = Image.new('1', (epd.width, epd.height), 255) # 255: clear the frame

第一个参数定义图片的颜色深度,定义为1说明是2位图,第二个参数是一个元组,定义好图片的宽度和高度,第三个参数是定义缓存的默认颜色,0为黑色,255为白色。

创建一个基于image的画图对象,所有的画图操作都在这个对象上draw = ImageDraw.Draw(image)画框draw.rectangle((0, 10, 200, 34), fill = 0)

第一个参数为一个4个元素的元组,(0,10)矩形左上角坐标值,(200,34)为矩形右下角坐标值,fill=0表示内部填充黑色。

画线draw.line((16, 60, 56, 60), fill = 0)

第一个参数为一个4个元素的元组,以(16,60)为起始点,(200,34)为终止点,画一条直线,fill=0表示线为黑色。

画圆draw.arc((90, 60, 150, 120), 0, 360, fill = 0)

在正方形内画一个内切圆,第一个参数为一个4个元素的元组,以(90,60)为正方形的左上角顶点,(150,120)为正方形右下角顶点,规定矩形框的水平中位线为0度角,角度顺时针变大,第二个参数表示开始角度,第三个参数标识结束角度,fill=0线为黑色如果不是正方形,画出来的就是椭圆,这个实际上是圆弧的绘制。

除了arc可以话圆之外,还有chord可以画实心圆

draw.chord((90, 130, 150, 190), 0, 360, fill = 0)

实质是弦的绘制,第一个参数指定弦的圆外切矩形,第二、三两个参数分别是弦的起始和终止角度, 第四个参数是填充颜色,将弦从0度到360度连接并填充就变成了填充的圆了。

写字符

写字符往往需要写不同大小的字符,需要导入ImageFont模块,并实例化:

font = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)

为了丰富字体库,这里使用的是windows目录下的字符文件,如果是其他的ttc结尾的字符文件也是支持的。

写英文字符直接使用即可,写中文,由于编码是GB2312所以需要在前面加个u:

draw.text((8, 12), 'hello world', font = font, fill = 255)draw.text((8, 36), u'斑梨电子', font = font, fill = 0)

第一个参数为一个2个元素的元组,以(8,12)为左顶点,字体为font,点,fill为字体颜色,第一句fill=255所以看上去是不会显示的,第二句显示斑梨电子。

读取本地图片image = Image.open(os.path.join(picdir, '1in54.bmp'))

参数为图片路径。

其他功能

python的image库十分强大,如果需要实现其他的更多功能,可以上官网学习http://effbot.org/imagingbook pil,官方的是英文的,如果感觉对你不友好,当然我们国内也有很多的优秀的博客都有讲解。

资料

提供文档、程序、数据手册等全套资料

文档原理图使用Photoshop制作散点图视频程序示例程序数据手册2.13inch e-Paper Specification V2版本 (当前版本)开发资料Image2Lcd图片取模软件字摸提取软件相关资料外壳图纸(待上传)

问题:电子墨水屏的使用环境?

  答复:【工作条件】温度范围:0~50°C ;湿度范围:35%~65%RH【存储条件】:温度范围:30°C以下; 湿度范围:55%RH以下;存储最长时间:6个月【运输条件】:温度范围:-25~70°C ;运输最长时间:10天【拆包后】:温度范围:20°C±5°C ; 湿度范围:50±5%RH;存储最长时间:72小时内完成组装

问题:电子墨水屏刷新注意事项

 答复:刷新模式全刷:电子墨水屏在刷新过程中会闪烁多次(闪烁次数取决于刷新时长),闪烁是为了清除残影达到最佳的显示效果局刷:电子墨水屏在刷新过程中无闪烁效果。使用局刷功能的用户注意在刷新几次之后,要进行一次全刷操作清除残影,否则残影问题会越来越严重,甚至损坏屏幕(目前只有部分黑白电子墨水屏支持局刷,具体参考产品页面说明)刷新频率使用过程中,建议客户设置电子墨水屏的刷新间隔至少为180秒(支持局刷功能的产品除外)待机过程(即刷新操作后)建议客户将电子墨水屏设置为睡眠模式,或者断电操作(可以将墨水屏供电部分用模拟开关断开), 降低功耗并且延长电子墨水屏寿命。(部分电子墨水屏如果长时间处于上电状态的话,会出现屏幕损坏无法修复的情况)三色电子墨水屏在使用的过程中,建议客户至少每24小时更新一次显示画面(如果屏幕长时间保持同一个画面,会出现烧屏情况难以修复)使用场所电子墨水屏建议是在室内使用。如果在户外使用,需要避免电子墨水屏受阳光直射,同时要做好紫外线防护措施。在设计电子墨水屏产品的时候,客户注意要确定好使用环境是否满足电子墨水屏的温湿度要求

问题:Arduino3.3V能不能驱动墨水屏?

  答复:可以,现在已经板载了电平转换芯片,支持3.3V驱动

问题:使用一段时间之后屏幕刷新(全刷)出现严重残影问题无法修复?

  答复:长时间上电开发板,在每次刷新操作之后,建议将屏幕设置为睡眠模式或者直接断电处理,否则屏幕长时间处于高电压状态下可能烧坏屏幕

问题:e-Paper显示偏黑或者颜色偏浅?

 答复:可以调节程序中Vcom的值改变显示对比度,带局刷的屏幕改善效果特别明显。

问题:e-Paper显示黑边框?

  答复:可以通过Border Waveform Control寄存器 或者VCOM AND DATA INTERVAL SETTING寄存器设置边框显示颜色。

问题:屏幕排线接口是什么规格?

  答复:0.5mm间距,24Pin。

问题: 运行python程序的时候报错ImportError: No module named Image?

 答复:使用指令sudo apt-get install python-imaging 安装一下imaging函数库

问题: 多个位置局刷,局刷几次后字体偏浅?

  答复:这种情况需要客户减少局刷位置并且在局刷5次后进行一次清屏(提高VCOM的电压可以改善颜色,但是带来是残影加重)。

问题: 墨水屏进入深入睡眠模式后,是否可以再次刷新?

  答复:可以,但是需要用软件重新做电子纸初始化操作。

问题: 2.9寸的EPD 在deep sleep mode时,第一次唤醒画面刷新会有不干净的问题,请问如何解决?

 答复:电子墨水屏重新唤醒的过程,实际是重新上电的过程,所以EPD在wake up时,要先进行清屏的动作,这样才能最大程度地避免残影现象。

问题: 关于datasheet的问题。客户问字库什么时候传输Data Start Transmission 1,什么时候用 Data Start Transmission 2.在KW mode 下,什么是“OLD”数据,什么是"NEW"数据。

  答复:如果是三色屏,在需要传输B/W数据时,使Data Start Transmission 1,在传输RED数据时,使用Data Start Transmission 2,因为2.13inch e-Paper HAT (D)只能显示黑白两色,所以工作在KW模式Data Start Transmission 1时,发送上一次的数据,即所谓的old,在程序中就直接发送0x00,在Data Start Transmission 2时,就发送需要刷新的数据,即所谓的“NEW”数据。

问题: 墨水屏使用的是什么型号的连接器?

 答复:排线插座 0.5-24pin 后翻盖式 2.0H(FPC连接器)

问题: 裸屏产品出货时是否有表面覆膜?

 答复:有覆膜

问题: 请问e-Paper内置温度传感器吗?

  答复:是的,也可以使用IIC管脚外置LM75温度传感器

问题: 测试程序时,程序一直卡在e-Paper busy

  答复:可能是spi驱动不成功导致的1.先检查接线是否正确2.在检查spi是否开启,参数是否配置正确(spi的波特率,spi模式等参数)

问题: 这款电子墨水屏的刷新次数是多少/使用寿命是多少?

 答复:理想情况下,正常使用,可以刷新1000000次(100万次)

问题: stm32驱动墨水屏,MDK编译显示空间不够?

  答复:我们例程使用的是stm32f103zet6,如果客户在MDK中修改其他的型号,例如stm32f103rbt6,ram空间变小了,需要在原基础上修改启动文件中的stack size和heap size

QQ : 202004841



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有